/*
 *    %W% %E%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.sun.corba.se.impl.ior ;

import org.omg.CORBA_2_3.portable.InputStream ;

import java.util.Map ;
import java.util.HashMap ;

import com.sun.corba.se.spi.orb.ORB ;

import com.sun.corba.se.spi.ior.Identifiable ;
import com.sun.corba.se.spi.ior.IdentifiableFactory ;
import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder ;

import com.sun.corba.se.spi.logging.CORBALogDomains ;

import com.sun.corba.se.impl.logging.IORSystemException ;

public abstract class IdentifiableFactoryFinderBase implements 
    IdentifiableFactoryFinder
{
    private ORB orb ;
    private Map map ;
    protected IORSystemException wrapper ;

    protected IdentifiableFactoryFinderBase( ORB orb )
    {
	map = new HashMap() ;
	this.orb = orb ;
	wrapper = IORSystemException.get( orb,
	    CORBALogDomains.OA_IOR ) ;
    }

    protected IdentifiableFactory getFactory(int id) 
    {
	Integer ident = new Integer( id ) ;
	IdentifiableFactory factory = (IdentifiableFactory)(map.get( 
	    ident ) ) ;
	return factory ;
    }

    public abstract Identifiable handleMissingFactory( int id, InputStream is ) ;
	
    public Identifiable create(int id, InputStream is) 
    {
	IdentifiableFactory factory = getFactory( id ) ;

	if (factory != null)
	    return factory.create( is ) ;
	else 
	    return handleMissingFactory( id, is ) ;
    }
    
    public void registerFactory(IdentifiableFactory factory) 
    {
	Integer ident = new Integer( factory.getId() ) ;
	map.put( ident, factory ) ;
    }
}
